home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / com2asm2.arc / COM2ASM2.BAS (.txt) next >
Encoding:
GW-BASIC  |  1984-04-24  |  2.5 KB  |  56 lines

  1. 10  'COM2ASM.BAS Ver 1.1; Program Copyright 1983 by Richard Winkel
  2. 20  'For free distribution only; not for sale.
  3. 30  DEFINT A-Z:DIM LIN$(999),JMP$(25) 'referenced addresses, jump instructions
  4. 40  GOSUB 530
  5. 50  INPUT "Enter name of input file: ",INFILE$
  6. 60  INPUT "Enter name of output file: ",OUTFILE$
  7. 70  OPEN INFILE$ FOR INPUT AS #1
  8. 80  OPEN OUTFILE$ FOR OUTPUT AS #2:PRINT #2,".RADIX 16"
  9. 90  IF EOF(1) THEN 160
  10. 100  LINE INPUT #1,A$:IF LEN(A$)<28 THEN 90 ELSE J$=MID$(A$,25,4)
  11. 110  FOR I=1 TO JMPNUM:IF J$<>JMP$(I) THEN NEXT:GOTO 90
  12. 120  IF MID$(A$,33,1)="[" THEN 90 'if indirect addressing, skip it
  13. 130  IF MID$(A$,33,3)="FAR" THEN 90
  14. 140  IF MID$(A$,37,1)=":" THEN 90 'if inter-segment jump, skip
  15. 150  LIN=LIN+1:LIN$(LIN)=MID$(A$,33,4):GOTO 90 'otherwise, save the reference
  16. 160  CLOSE #1:OPEN INFILE$ FOR INPUT AS #1 're-position read pointer
  17. 170  PRINT "Sorting . ." 'super shell sort (byte may '83)
  18. 180  D=2^INT(LOG(LIN)/LOG(2))-1 'sort referenced addresses
  19. 190  FOR I=1 TO LIN-D
  20. 200  IF LIN$(I)<=LIN$(I+D) THEN 260 ELSE T$=LIN$(I+D):LIN$(I+D)=LIN$(I)
  21. 210  IF I<=D THEN LIN$(I)=T$:GOTO 260
  22. 220  FOR J=I-D TO 1 STEP -D
  23. 230  IF T$>=LIN$(J) THEN 250 ELSE LIN$(J+D)=LIN$(J)
  24. 240  NEXT J
  25. 250  LIN$(J+D)=T$
  26. 260  NEXT I
  27. 270  D=INT(D/2):IF D>0 THEN 190 ELSE I=1
  28. 280  IF I=LIN THEN 310 'array is sorted, now get rid of duplicates
  29. 290  IF LIN$(I)=LIN$(I+1) THEN FOR J=I TO LIN:LIN$(J)=LIN$(J+1):NEXT:LIN=LIN-1 ELSE I=I+1
  30. 300  GOTO 280
  31. 310  L=1 'now go back thru file and plug in labels for addresses
  32. 320  IF NOT EOF(1) THEN 360 ELSE IF L>LIN THEN 350 'else premature EOF
  33. 330  PRINT "Error: Referenced code at ";LIN$(L);" was not found."
  34. 340  PRINT "The following reference(s) were not processed:":FOR I=L TO LIN:PRINT LIN$(I),:NEXT
  35. 350  CLOSE:END
  36. 360  LINE INPUT #1,A$:IF LEN(A$)<28 THEN 320
  37. 370  IF MID$(A$,6,4)<LIN$(L) THEN MID$(A$,6,4)="    ":GOTO 420 'not referenced
  38. 380  IF MID$(A$,6,4)=LIN$(L) THEN 400 'plug in label
  39. 390  IF L>LIN THEN MID$(A$,6,4)="    ":GOTO 420 ELSE 330 'err: skipped over code
  40. 400  L$=STR$(L):L$="L"+RIGHT$(L$,LEN(L$)-1)
  41. 410  L$=L$+":"+STRING$(4-LEN(L$)," "):MID$(A$,6,5)=L$:L=L+1
  42. 420  J$=MID$(A$,25,4):FOR I=1 TO JMPNUM:IF J$<>JMP$(I) THEN NEXT:GOTO 490
  43. 430  IF MID$(A$,33,1)="[" THEN 490
  44. 440  IF MID$(A$,33,3)="FAR" THEN 490
  45. 450  IF MID$(A$,37,1)=":" THEN 490
  46. 460  REF$=MID$(A$,33,4):FOR I=1 TO LIN:IF REF$<>LIN$(I) THEN NEXT
  47. 470  L$=STR$(I):L$="L"+RIGHT$(L$,LEN(L$)-1) 'replace destination addr with label
  48. 480  MID$(A$,33,4)=L$+STRING$(4-LEN(L$)," ")
  49. 490  A$=MID$(A$,6,5)+"  "+RIGHT$(A$,LEN(A$)-23) 'get rid of set & op code
  50. 500  FOR I=LEN(A$) TO 2 STEP -1:IF MID$(A$,I,1)=" " THEN NEXT
  51. 510  A$=LEFT$(A$,I) 'chop off trailing blanks
  52. 520  PRINT A$:PRINT #2,A$:GOTO 320
  53. 530  JMPNUM=21:FOR I=1 TO JMPNUM:READ JMP$(I):NEXT:RETURN
  54. 540  DATA "JMP ",JMPS,"JZ  ","JNZ ",LOOP,CALL,JCXZ,"JB  ","JBE ","JNB ","JA  "
  55. 550  DATA "JG  ","JGE ","JL  ","JLE ","JNO ","JPO ","JNS ","JO  ","JPE ","JS  "
  56.